import json
from tools.constant.redis_keys import ALGO_CONFIG_KEY
from tools.utils.redis_client import redis_client_instance
from tools.vo.algo_params import AlgoParamDefine


def update_algo_description(algo_name,
                            algo_show_name,
                            algo_icon="defaut.icon",
                            algo_args=[],
                            bus_args=[],
                            model_id=None,
                            algo_type=0,#算法类型0 普通算法 1，可以合并的算法，2.视频流算法
                            redis_client=redis_client_instance()):
    """
    更新算法描述信息。

    该函数用于更新或初始化算法的配置信息，包括算法名称、显示名称、图标以及相关参数。
    它将这些信息存储在Redis中，以便在系统中共享和使用。

    参数:
    algo_name (str): 算法的唯一名称，用于标识算法。
    algo_show_name (str): 算法的显示名称，如果未提供，则使用algo_name。
    algo_icon (str): 算法的图标路径，默认为"default.icon"。
    algo_args (dict): 算法的具体参数字典，默认为空字典。 类型为AlgoParamDefine list
    bus_args (dict): 与算法相关的业务参数字典，默认为空字典。 类型为AlgoParamDefine  list
    redis_client: Redis客户端实例，默认为redis_client_instance()。

    返回:
    无
    """
    if algo_show_name is None:
        algo_show_name = algo_name
    algo_config_args = {
         "@class": "java.lang.Object",
        "algo_name": algo_name,
        "algo_show_name": algo_show_name,
        "algo_icon": algo_icon,
        "algo_args": algo_args,
        "model_id": model_id,
        "algo_type":algo_type,
        "bus_args": bus_args
    }
    redis_client.hset(ALGO_CONFIG_KEY, algo_name,json.dumps(algo_config_args).encode("utf-8"))

if __name__ == "__main__":
    args1 = AlgoParamDefine(
        key="age",
        display_name="年龄",
        is_required=True,
        regex_pattern="^[0-9]+$",
        data_type=2,
        max_value=99,
        min_value=18,
        ui_render_type="input"
    )
    args2 = AlgoParamDefine(
        key="gender",
        display_name="性别",
        is_required=True,
        data_type=2,
        options={"multiple":1,"options":[{"label": "男", "value": 1},{"label": "女", "value": 0}]},
        ui_render_type="select"
    )
    args3 = AlgoParamDefine(
        key="aglo",
        display_name="置信率",
        is_required=True,
        data_type=2,
        max_value=0.99,
        min_value=0.24,
        options = {"step":0.01},
        ui_render_type="input"
    )
    args4 = AlgoParamDefine(
        key="aglo2",
        display_name="算法高级参数",
        is_required=True,
        data_type=1,
        ui_render_type="input"
    )
    update_algo_description(algo_name="test_algo",
                            algo_show_name="测试专用算法参数",
                            algo_icon='hcytech.ico',
                            algo_args=[args1.to_dict(),args2.to_dict()],
                            bus_args=[args3.to_dict(),args4.to_dict()],
                            algo_type=1,
                            model_id='s3')